'use strict';
// module.exports = app => {
// app.beforeStart(async () => {
//   await app.model.sync({});
// });

// };

class AppBootHook {
  constructor(app) {
    this.app = app;
  }

  configWillLoad() {
  // 此时 config 文件已经被读取并合并，但是还并未生效
  // 这是应用层修改配置的最后时机
  // 注意：此函数只支持同步调用

  // 例如：参数中的密码是加密的，在此处进行解密
  // this.app.config.mysql.password = decrypt(this.app.config.mysql.password);
  // 例如：插入一个中间件到框架的 coreMiddleware 之间
  // const statusIdx = this.app.config.coreMiddleware.indexOf('status');
  // this.app.config.coreMiddleware.splice(statusIdx + 1, 0, 'limit');
  }

  async didLoad() {
  // 所有的配置已经加载完毕
    // 可以用来加载应用自定义的文件，启动自定义的服务
    // 例如：加载自定义的目录
    // const path = require('path');
    // 加载所有的校验规则
    // const directory = path.join(this.app.config.baseDir, 'app/validate');
    // this.app.loader.loadToApp(directory, 'validate');
  }

  async willReady() {
  // 所有的插件都已启动完毕，但是应用整体还未 ready
  // 可以做一些数据初始化等操作，这些操作成功才会启动应用

  // 例如：从数据库加载数据到内存缓存
  // this.app.cacheData = await this.app.model.query(QUERY_CACHE_SQL);
  }

  async didReady() {
  // 应用已经启动完毕

    this.app.beforeStart(async () => {
      // 如果是开发环境就初始化数据库
      const isDev = process.env.NODE_ENV === 'development';
      if (isDev) {
        console.log('Start syncing database models...');
        await this.app.model.sync({});
      }
      // await this.app.model.sync({});
      // User.sync() - 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)
      // User.sync({ force: true }) //-强制 将创建表,如果表已经存在,则将其首先删除再创建
      // User.sync({ alter: true }) - 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配.

    });

  // const ctx = await this.app.createAnonymousContext();
  // await ctx.service.Biz.request();
  }

  async serverDidReady() {
  // http / https server 已启动，开始接受外部请求
  // 此时可以从 app.server 拿到 server 的实例

  // this.app.server.on('timeout', socket => {
  // handle socket timeout
  // });
  }
}

module.exports = AppBootHook;
